home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / printf.c < prev    next >
Text File  |  1990-12-19  |  2KB  |  96 lines

  1.  
  2. /*
  3.  * @(#)printf.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. char chardigs[]="0123456789ABCDEF";
  8. /*
  9.  * Scaled down version of C Library printf.
  10.  * Only %s %d %x %c are recognized.
  11.  */
  12. /*VARARGS0*/
  13. printf(fmt, x1)
  14. register unsigned char *fmt;
  15. unsigned x1;
  16. {
  17.     register unsigned c;
  18.     register unsigned int *adx;
  19.     register unsigned char *s;
  20.  
  21.     adx = &x1;
  22.     while ((c = *fmt++) != '\0') {
  23.         if (c != '%')
  24.             putchar(c);
  25.         else {
  26.             c = *fmt++;
  27.             switch (c) {
  28.  
  29.             case 'c':
  30.                 c = (unsigned char)*adx;
  31.                 putchar(c);
  32.                 break;
  33.  
  34.             case 's':
  35.                 s = (unsigned char *)*adx;
  36.                 while (c = *s++)
  37.                     putchar(c);
  38.                 break;
  39.  
  40.             case 'd':
  41.                 printn((unsigned long)*adx, 10);
  42.                 break;
  43.  
  44.             case 'x':
  45.                 printn((unsigned long)*adx, 16);
  46.                 break;
  47.  
  48.             }
  49.             adx++;
  50.         }
  51.     }
  52. }
  53.  
  54. /*
  55.  * Print an unsigned integer in base b.
  56.  */
  57. printn(n, b)
  58. unsigned long n;
  59. unsigned long b;
  60. {
  61.     unsigned long a;
  62.  
  63.     if(a = n/b) {
  64.         printn(a, b);
  65.         /*
  66.          * The following 4 lines are a kludge which cause inline
  67.          * multiplies to be used.  Compiler won't generate inline
  68.          * multiply except by constants (hack) even though it's
  69.          * exxactly the same to multiply by a random unsigned short.
  70.          * When there's no need to kludge, replace by:
  71.          *     n -= a * (unsigned short)b;
  72.          */
  73.         if (16 == (char) b) 
  74.             n -= a * 16;
  75.         else
  76.             n -= a * 10;
  77.     }
  78. /* MJC 5-16-86  I cant find a reason to use this with chardigs there 
  79.     putchar((unsigned char)"0123456789ABCDEF"[n]);
  80. */
  81.     putchar(chardigs[n]);
  82. }
  83.  
  84. /*
  85.  * printhex() prints rightmost <digs> hex digits of <val>
  86.  */
  87. printhex(val,digs)
  88.         register int val;
  89.         register int digs;
  90. {
  91.         digs = ((digs-1)&7)<<2;         /* digs == 0 => print 8 digits */
  92.         for (; digs >= 0; digs-=4)
  93.                 putchar(chardigs[(val>>digs)&0xF]);
  94. }
  95.  
  96.